/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ravennet.backing;

import com.ravennet.dataobject.PartidaDataObject;
import com.ravennet.manager.CrucigramaManager;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;


@Named(value = "crucigramaBacking")
@RequestScoped
public class CrucigramaBacking {
    
    private String nombre="";
    private String password="";
    private String[][] tablero=null;
    private String tableroDo;
    private String partidaActual="";
    private String partidaABuscar="";
    private PartidaDataObject partida;
    
    private String jugador1;
    private String jugador2;
    private String jugador3;
    private String jugador4;
    
    private String listaLetrasDisponibles;
    
    private String jugada;

    
    
    //TODO listar los usuarios de la partida.
    public CrucigramaBacking(){
        
    }
    
    public String realizarJugada(){
        PartidaDataObject part = this.getPartida();
        part.realizarJuagada(this.nombre, jugada);

        
        
        return null;
    }
    
    public PartidaDataObject getPartida(){
        if(this.partida==null)
            this.partida = (PartidaDataObject)this.getFromSession("partidaDOActual");
        return this.partida;
    }
    
    public void setPartida(PartidaDataObject partida){
        this.putInSession("partidaDOActual", partida);
        this.partida = partida;
    }
    
    
    
    public String unirseAPartida(){
        this.adicionarUsuarioPartida(this.getPartidaABuscar());
        return null;
    }
    
    private void adicionarUsuarioPartida(String partida){
        try {
            this.setPartida(this.getManager().buscarPartida(partida));
            this.getPartida().addUsuarioAPartida(nombre);
            this.getManager().getPartidaManager().guardarTodo();
            
        } catch (Exception ex) {
            Logger.getLogger(CrucigramaBacking.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            this.mostrarMensaje(ex.getMessage());
        }
        
    }
    
    public String asignarNombre(){
        if(this.getManager().validarUsuario(this.getNombre(), this.getPassword())){
            this.putInSession("nombre", this.getNombre());    
        }else{
            this.mostrarMensaje("Usuario o Password incorrecto");
        }

        return null;

    }
    
    public String crearJuego(){
        
        CrucigramaManager cm =  this.getManager();
        this.setPartida(cm.crearNuevoJuego(nombre));
        this.setPartidaActual(this.getPartida().getId());
        this.setTableroDo(this.getPartida().getTablero().toString());
        this.listaLetrasDisponibles = (partida.getUsuarioUno().getListaLetrasUsuario().toString());
        
        return null;
    }
       
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public String[][] getTablero() {
        
        CrucigramaManager manager = this.getManager();    
                
        tablero = manager.getArrayTablero();
        
        return tablero;
    }

    public void setTablero(String[][] tablero) {
        this.tablero = tablero;
    }
    
    public String getTableroDo(){
        if(this.getPartida()==null){
            this.tableroDo = "[['C','R','U','C','I','G','R','A','M','A',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],";
            this.tableroDo+="[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]";
        }else{
            this.tableroDo = this.getPartida().getTablero().toString();
        }
        return tableroDo;
    }
    
    public void setTableroDo(String tableroDo){
        this.tableroDo=tableroDo;
    }
    
    
    
    private CrucigramaManager getManager(){
       FacesContext ctx = FacesContext.getCurrentInstance();
       HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest();
       CrucigramaManager manager = (CrucigramaManager) request.getServletContext().getAttribute("CrucigramaManager");
       if(manager==null){
            manager = new CrucigramaManager();
            request.getServletContext().setAttribute("CrucigramaManager", manager);
        }
       return manager;
    }
    
    private void putInSession(String llave, Object valor){
        HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        httpServletRequest.getSession().setAttribute(llave, valor);
    }
    
    private Object getFromSession(String key){
        HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        return httpServletRequest.getSession().getAttribute(key) ;
    }
    
    
    public String getPartidaActual() {
        return partidaActual;
    }

    public void setPartidaActual(String partidaActual) {
        this.partidaActual = partidaActual;
    }
    public String getPartidaABuscar() {
        return partidaABuscar;
    }

    public void setPartidaABuscar(String partidaABuscar) {
        this.partidaABuscar = partidaABuscar;
    }
    
    public String getJugador1() {
        if(this.getPartida() == null)
            return "";
        this.jugador1 = this.getPartida().getUsuarioUno()==null ? "N/A" : this.getPartida().getUsuarioUno().getNombre();
        return jugador1;
    }

    public void setJugador1(String jugador1) {
        this.jugador1 = jugador1;
    }

    public String getJugador2() {
        if(this.getPartida() == null)
            return "";
        this.jugador2 = this.getPartida().getUsuarioDos()==null ? "N/A" : this.getPartida().getUsuarioDos().getNombre();
        return jugador2;
    }

    public void setJugador2(String jugador2) {
        this.jugador2 = jugador2;
    }

    public String getJugador3() {
        if(this.getPartida() == null)
            return "";
        this.jugador3 = this.getPartida().getUsuarioTres()==null ? "N/A" : this.getPartida().getUsuarioTres().getNombre();
        return jugador3;
    }

    public void setJugador3(String jugador3) {
        this.jugador3 = jugador3;
    }

    public String getJugador4() {
        if(this.getPartida() == null)
            return "";
        this.jugador4 = this.getPartida().getUsuarioCuatro()==null ? "N/A" : this.getPartida().getUsuarioCuatro().getNombre();
        return jugador4;
    }

    public void setJugador4(String jugador4) {
        this.jugador4 = jugador4;
    }
    
    public String getListaLetrasDisponibles() {
        try {
            if(this.getPartida() == null)
                return "";
            this.listaLetrasDisponibles = this.getPartida().getJugador(nombre).getListaLetrasUsuario().toString();
            return listaLetrasDisponibles;
        } catch (Exception ex) {
            ex.printStackTrace();
            return "";
        }
    }

    public void setListaLetrasDisponibles(String listaLetrasDisponibles) {
        this.listaLetrasDisponibles = listaLetrasDisponibles;
    }
    
    public String getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password = password;
    }
    
    public String registrarNuevoUsuario(){
        try {
            this.getManager().registrarUsuario(this.getNombre(), this.getPassword());
        } catch (Exception ex) {
            Logger.getLogger(CrucigramaBacking.class.getName()).log(Level.SEVERE, null, ex);
            this.setNombre("El nombre ya existe, ingresa otro");
            ex.printStackTrace();
        }
        
        return null;
    }
    
    public String getJugada() {
        return jugada;
    }

    public void setJugada(String jugada) {
        this.jugada = jugada;
    }
    
    private void mostrarMensaje(String mensaje)
    {       
        FacesContext context = FacesContext.getCurrentInstance();        
        context.addMessage(null,new FacesMessage(mensaje));        
    }
    
}



